using System;

namespace PolymorphismExample // 命名空间
{
    public class Animal // 基类
    {
        public virtual void Speak() // 虚方法
        {
            Console.WriteLine("The animal makes a sound.");
        }
    }

    public class Dog : Animal // 派生类
    {
        public override void Speak() // 重写基类的虚方法
        {
            Console.WriteLine("The dog says: Woof!");
        }
    }

    public class Cat : Animal // 派生类
    {
        public override void Speak() // 重写基类的虚方法
        {
            Console.WriteLine("The cat says: Meow!");
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            // 声明一个 Animal 类型的数组
            Animal[] animals = new Animal[3];
            animals[0] = new Dog(); // 将 Dog 类型的对象赋给 Animal 类型的引用
            animals[1] = new Cat(); // 将 Cat 类型的对象赋给 Animal 类型的引用
            animals[2] = new Animal(); // 基类对象

            foreach (var animal in animals)
            {
                animal.Speak(); // 调用 Speak 方法，展现多态性
            }
        }
    }
}
